package com.buercorp.wangyu.file;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.invoke.VarHandle;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * 压缩流
 * 压缩文件夹
 * 把D:\DevelopSpace\IdeaSpace\wy-test-demo\aaa文件压缩成一个压缩包
 * @author liyiyu
 */
public class FileTest17 {
    public static void main(String[] args) throws IOException {
        // 1.创建File对象表示要压缩的文件夹
        File src = new File("D:\\DevelopSpace\\IdeaSpace\\wy-test-demo\\aaa");
        // 2.创建File对象表示压缩包放在哪里 (压缩包的父级路径)
        File destParent = src.getParentFile(); // D:\DevelopSpace\IdeaSpace\wy-test-demo
        // 3.创建File对象表示压缩包的路径 src.getName() aaa
        File dest = new File(destParent, src.getName() + ".zip");
//        System.out.println(dest); // D:\DevelopSpace\IdeaSpace\wy-test-demo\aaa.zip
        // 4.创建压缩流关联压缩包
        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(dest));
        // 5.获取src里面的每一个文件，变成ZipEntry对象，放入到压缩包当中
        tozip(src,zos, src.getName());
        // 6.释放资源
        zos.close();
    }

    public static void tozip(File src, ZipOutputStream zos, String name) throws IOException {
        // 1.进入src文件夹 获取一个目录（src）下的所有文件和子目录
        File[] files = src.listFiles();

        for (File file : files) {
            if (file.isFile()) {
                // 判断文件 变成ZipEntey对象 放入到压缩包当中
                ZipEntry entry = new ZipEntry(name + "\\" + file.getName());
                zos.putNextEntry(entry);
                // 读取文件的数据 写到压缩包中
                FileInputStream fis = new FileInputStream(file);
                int len;
                byte[] bytes = new byte[1024];
                while ((len = fis.read(bytes)) != -1) {
                    zos.write(bytes, 0 ,len);
                }
                fis.close();
                zos.closeEntry();
            } else {
                // 文件夹 递归
                tozip(file,zos,name + "\\" + file.getName());
            }
        }
    }

}
